package com.fary.context.annotation;

import com.fary.beans.factory.support.BeanNameGenerator;
import com.fary.core.annotation.AliasFor;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {

	/**
	 * 扫描的包路径
	 */
	@AliasFor("basePackages")
	String[] value() default {};

	/**
	 * 扫描的包路径
	 */
	@AliasFor("value")
	String[] basePackages() default {};

	/**
	 * 扫描的类，会扫描该类所在包及其子包的组件。
	 */
	Class<?>[] basePackageClasses() default {};

	/**
	 * 名字生成器
	 */
	Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

	/**
	 * 处理检测到的bean的scope范围 默认是AnnotationScopeMetadataResolver
	 */
	Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;

	/**
	 * 是否为检测到的组件生成代理 默认是ScopedProxyMode.DEFAULT
	 */
	ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;

	/**
	 * 扫描的规则
	 */
	String resourcePattern() default ClassPathScanningCandidateComponentProvider.DEFAULT_RESOURCE_PATTERN;

	/**
	 * 是否使用默认的过滤器，默认true
	 */
	boolean useDefaultFilters() default true;

	/**
	 * 包含过滤器
	 */
	Filter[] includeFilters() default {};

	/**
	 * 排除过滤器
	 */
	Filter[] excludeFilters() default {};

	/**
	 * 是否延迟加载
	 */
	boolean lazyInit() default false;

	@Retention(RetentionPolicy.RUNTIME)
	@Target({})
	@interface Filter {

		FilterType type() default FilterType.ANNOTATION;

		@AliasFor("classes")
		Class<?>[] value() default {};

		@AliasFor("value")
		Class<?>[] classes() default {};

		String[] pattern() default {};

	}

}